﻿// ## 2023/5/03 # 铃 # 修改了小城市的算法,现在小城市只有市场收入才会继承大城市,自己依然有人丁税收的收入. ##
// ## 2023/1/23 # 铃 # 根据小城市的收入特征,再次优化算法 ##
// ## 2022/12/29 # 铃 # 再次优化人口系统,同时优化资金算法,使得收入更平滑 ##
// ## 2022/11/2 # 铃 # 修改了资金收入算法,以适配新的人口系统 ##
// ## 2022/08/08 # 铃 # 把城市收入赋予结构体 ##
// ## 2022/02/17 # 江东新风 # 人口设定调整 ##
// ## 2021/10/01 # 江东新风 # namespace的韩文改成英文 ##
// ## 2021/02/17 # 江东新风 # 城市数惩罚设置上限，调整系数 ##
// ## 2021/02/12 # 氕氘氚 # 解决港关非所属时收入的问题##
// ## 2020/12/12 # 江东新风 # 修复trace参数报错 ##
// ## 2020/10/23 #江东新风#同步马术书大神的更新，添加城市数量惩罚 ##
// ## 2020/09/28 # 氕氘氚 # 添加固定收入 ##
/*
@수정자: 기마책사
@Update: '18.12.22  / 변경내용: 병기차감 스크립트 분리
@Update: '19.2.23   / 변경내용: 게임 내에서 x0.2 자동적용되어서 스크립트에서 제외
*/

namespace GATE_REVENUE
{
	const bool 调试模式 = false;
	class Main
	{
		Main()
		{
			pk::set_func(152, pk::func152_t(callback));
			pk::bind(100, pk::trigger100_t(onTitleScreen));
		}

		void onTitleScreen()
		{
			pk::set_independent_income(true); // 开启港关独立收入（会同时让无势力港关有收入，需在后方排除）
		}

		int callback(pk::building @building, int city_revenue)
		{

			if (!pk::is_alive(building))
				return 0;
			if (!pk::is_valid_normal_force_id(building.get_force_id()))
				return 0;

			int n = 0;
			int base_id = building.get_id();

			n += inter::get_population_revenue(base_id);

			// 全局修正
			n = inter::incomes_global_impact(n, building, 0);

			// 因为城市收入已经被难度修正过一次了,因此放在难度修正系数之后.
			pk::city @city = pk::get_city(pk::get_city_id(building.pos));
			if (city.get_force_id() == building.get_force_id())
			{
				if (ch::is_gate(building.get_id()))
					n += int(city_revenue * 0.05);
				else
					n += int(city_revenue * 0.1);
			}

			else
			{
				if (ch::is_gate(building.get_id()))
					n += int(city_revenue * 0);
				else
					n += int(city_revenue * 0.01);
			}

			int buff = 0;
			if (city_tech::is_building_force_has_city(building, 39))
				buff = pk::max(5, buff);

			if (city_tech::is_building_force_has_city(building, 6))
				buff = pk::max(5, buff);

			n = int(n * (100 + buff) / 100);

			n += ch::get_base_p(building.get_id()).revenue_bonus;

			int base_revenue = n;

			// 下方函数用于获取城市收支，以便计算内政自动化各类花费---可以考虑是否有更好的写法
			pk::bool_bool skill_check = ch::has_skill(building, 特技_富豪, 特技_征税);
			bool 富豪特技 = skill_check.first;
			bool 征税特技 = skill_check.second;
			auto base_p = ch::get_base_p(building.get_id());

			if (富豪特技 and !征税特技)
				base_revenue = int(base_revenue * 1.5);

			if (!富豪特技 and 征税特技)
				base_revenue = int(base_revenue * 0.5 * 3);

			if (富豪特技 and 征税特技)
				base_revenue = int(base_revenue * 0.5) + int(base_revenue * 0.5) + int(base_revenue * 0.5 * 1.5);

			base_p.base_revenue = uint32(base_revenue);

			return n;
		}

		//---------------------------------------------------------------------------------------

	}

	Main main;
}